package common

import (
	rund_ "math/rand"
	"strconv"
	"strings"
)

var firsNames = []string{
	"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施",
	"张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范",
	"彭", "郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷",
	"贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜",
	"顾", "孟", "平", "黄", "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成",
	"戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路",
	"娄", "危", "江", "童", "颜", "郭", "梅", "盛", "林", "刁", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞",
	"万", "支", "柯", "昝", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪",
	"包", "诸", "左", "石", "崔", "吉", "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "曲", "家",
	"封", "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓", "牧", "隗", "山", "谷", "车", "侯",
	"宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫", "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘", "景",
	"詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂", "索", "咸", "籍", "赖",
	"卓", "蔺", "屠", "蒙", "池", "乔", "阴", "鬱", "胥", "能", "苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶",
}
var lastNames = []string{
	"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十",
	"二十一", "二十二", "二十三", "二十四", "二十五", "二十六", "二十七", "二十八", "二十九", "三十", "三十一", "三十二", "三十三", "三十四", "三十五",
	"三十六", "三十七", "三十八", "三十九", "四十", "四十一", "四十二", "四十三", "四十四", "四十五", "四十六", "四十七", "四十八", "四十九", "五十",
	"五十一", "五十二", "五十三", "五十四", "五十五", "五十六", "五十七", "五十八", "五十九", "六十", "六十一", "六十二", "六十三", "六十四", "六十五",
}

var englishChars = []string{
	"a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
	"k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
	"u", "v", "w", "x", "y", "z",
}

// 1~9
var numbers = []string{
	"1", "2", "3", "4", "5", "6", "7", "8", "9",
}

// 句子符号
var sentenceChars = []string{
	"。", "，", "！", "？", "：", "；", "、", "（", "）", "【", "】", "《", "》", "‘", "’", "“", "”", "—", "…",
}

// 国家
var countries = []string{
	"阿富汗", "阿尔巴尼亚", "阿尔及利亚", "安道尔", "安哥拉", "安提瓜和巴布达", "阿根廷", "亚美尼亚", "澳大利亚", "奥地利", "阿塞拜疆",
	"巴哈马", "巴林", "孟加拉国", "巴巴多斯", "白俄罗斯", "比利时", "伯利兹", "贝宁", "不丹", "玻利维亚", "波斯尼亚和黑塞哥维那",
	"博茨瓦纳", "巴西", "文莱", "保加利亚", "布基纳法索", "布隆迪", "柬埔寨", "喀麦隆", "加拿大", "佛得角", "中非共和国", "乍得",
	"智利", "中国", "哥伦比亚", "科摩罗", "刚果", "哥斯达黎加", "科特迪瓦", "克罗地亚", "古巴", "塞浦路斯", "捷克共和国", "朝鲜",
	"刚果（扎伊尔）", "丹麦", "吉布提", "多米尼加", "多米尼加共和国", "东帝汶", "厄瓜多尔", "埃及", "萨尔瓦多", "赤道几内亚", "厄立特里亚",
	"爱沙尼亚", "埃塞俄比亚", "斐济", "芬兰", "法国", "加蓬", "冈比亚", "格鲁吉亚", "德国", "加纳", "希腊", "格林纳达", "危地马拉",
	"几内亚", "几内亚比绍", "圭亚那", "海地", "洪都拉斯", "匈牙利", "冰岛", "印度", "印度尼西亚", "伊朗", "伊拉克", "爱尔兰",
	"以色列", "意大利", "牙买加", "日本", "约旦", "哈萨克斯坦", "肯尼亚", "基里巴斯", "朝鲜", "韩国", "科威特", "吉尔吉斯斯坦",
	"老挝", "拉脱维亚", "黎巴嫩", "莱索托", "利比里亚", "利比亚", "列支敦士登", "立陶宛", "卢森堡", "马其顿", "马达加斯加", "马拉维",
	"马来西亚", "马尔代夫", "马里", "马耳他", "马绍尔群岛", "毛里塔尼亚", "毛里求斯", "墨西哥", "密克罗尼西亚", "摩尔多瓦", "摩纳哥",
	"蒙古", "黑山", "摩洛哥", "莫桑比克", "缅甸", "纳米比亚", "瑙鲁", "尼泊尔", "荷兰", "新西兰", "尼加拉瓜", "尼日尔", "尼日利亚",
	"挪威", "阿曼", "巴基斯坦", "帕劳", "巴勒斯坦", "巴拿马", "巴布亚新几内亚", "巴拉圭", "秘鲁", "菲律宾", "波兰", "葡萄牙",
	"卡塔尔", "罗马尼亚", "俄罗斯", "卢旺达", "圣基茨和尼维斯", "圣卢西亚", "圣文森特和格林纳丁斯", "萨摩亚", "圣马力诺", "圣多美和普林西比",
	"沙特阿拉伯", "塞内加尔", "塞尔维亚", "塞舌尔", "塞拉利昂", "新加坡", "斯洛伐克", "斯洛文尼亚", "所罗门群岛", "索马里", "南非",
	"西班牙", "斯里兰卡", "苏丹", "苏里南", "斯威士兰", "瑞典", "瑞士", "叙利亚", "塔吉克斯坦", "坦桑尼亚", "泰国", "多哥", "汤加",
	"特立尼达和多巴哥", "突尼斯", "土耳其", "土库曼斯坦", "图瓦卢", "乌干达", "乌克兰", "阿拉伯联合酋长国", "英国", "美国", "乌拉圭",
	"乌兹别克斯坦", "瓦努阿图", "梵蒂冈", "委内瑞拉", "越南", "也门", "赞比亚", "津巴布韦",
}

// 省
var provinces = []string{
	"北京", "天津", "河北", "山西", "内蒙古", "辽宁", "吉林", "黑龙江", "上海", "江苏",
	"浙江", "安徽", "福建", "江西", "山东", "河南", "湖北", "湖南", "广东", "广西",
	"海南", "重庆", "四川", "贵州", "云南", "西藏", "陕西", "甘肃", "青海", "宁夏",
	"新疆", "台湾", "香港", "澳门",
}

// 市
var cities = []string{
	"北京", "天津", "石家庄", "唐山", "秦皇岛", "邯郸", "邢台", "保定", "张家口", "承德",
	"沧州", "廊坊", "衡水", "太原", "大同", "阳泉", "长治", "晋城", "朔州", "晋中",
	"运城", "忻州", "临汾", "吕梁", "呼和浩特", "包头", "乌海", "赤峰", "通辽", "鄂尔多斯",
	"呼伦贝尔", "巴彦淖尔", "乌兰察布", "兴安盟", "锡林郭勒盟", "阿拉善盟", "沈阳", "大连", "鞍山", "抚顺",
	"本溪", "丹东", "锦州", "营口", "阜新", "辽阳", "盘锦", "铁岭", "朝阳", "葫芦岛",
	"长春", "吉林", "四平", "辽源", "通化", "白山", "松原", "白城", "延边", "哈尔滨",
	"齐齐哈尔", "鸡西", "鹤岗", "双鸭山", "大庆", "伊春", "佳木斯", "七台河", "牡丹江", "黑河",
	"绥化", "大兴安岭", "上海", "南京", "无锡", "徐州", "常州", "苏州", "南通", "连云港",
	"淮安", "盐城", "扬州", "镇江", "泰州", "宿迁", "杭州", "宁波", "温州", "嘉兴",
}

// 区
var areas = []string{
	"东城区", "西城区", "崇文区", "宣武区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区",
	"通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区", "密云县", "延庆县", "和平区", "河东区",
	"河西区", "南开区", "河北区", "红桥区", "塘沽区", "汉沽区", "大港区", "东丽区", "西青区", "津南区",
	"北辰区", "武清区", "宝坻区", "宁河县", "静海县", "蓟县", "长安区", "桥东区", "桥西区", "新华区",
	"井陉矿区", "裕华区", "井陉县", "正定县", "栾城县", "行唐县", "灵寿县", "高邑县", "深泽县", "赞皇县",
	"无极县", "平山县", "元氏县", "赵县", "辛集市", "藁城市", "晋州市", "新乐市", "鹿泉市", "路南区",
	"路北区", "古冶区", "开平区", "丰南区", "丰润区", "滦县", "滦南县", "乐亭县", "迁西县", "玉田县",
	"唐海县", "遵化市", "迁安市", "海港区", "山海关区", "北戴河区", "青龙满族自治县", "昌黎县", "抚宁县", "卢龙县",
	"邯山区", "丛台区", "复兴区", "峰峰矿区", "邯郸县", "临漳县", "成安县", "大名县", "涉县", "磁县",
	"肥乡县", "永年县", "邱县", "鸡泽县", "广平县", "馆陶县", "魏县", "曲周县", "武安市", "桥东区",
	"桥西区", "邢台县", "临城县", "内丘县", "柏乡县", "隆尧县", "任县", "南和县", "宁晋县", "巨鹿县",
	"新河县", "广宗县", "平乡县", "威县", "清河县", "临西县", "南宫市", "沙河市", "新市区", "北市区",
	"南市区", "满城县", "清苑县", "涞水县", "阜平县", "徐水县", "定兴县", "唐县", "高阳县", "容城县",
	"涞源县", "望都县", "安新县", "易县", "曲阳县", "蠡县", "顺平县", "博野县", "雄县", "涿州市",
}

// 根据类型自动生成数据   ,根据keyword生产合适的数据
func AutoGenerateDataByType(dataType string, keyword string) any {
	keyword = strings.ToLower(keyword) //转小写
	//去下划线
	keyword = strings.Replace(keyword, "_", "", -1)
	//去空格
	keyword = strings.Replace(keyword, " ", "", -1)
	//去-
	keyword = strings.Replace(keyword, "-", "", -1)

	dataType = strings.ToLower(dataType) //转小写
	switch dataType {
	case "string":
		//如果带Name,则生成名字
		if strings.Contains(keyword, "name") {
			return RandomName()
		}
		//FirstName
		if strings.Contains(keyword, "firstname") {
			return RandomFirstName()
		}
		//LastName
		if strings.Contains(keyword, "lastname") {
			return RandomLastName()
		}

		//如果带Email,则生成邮箱
		if strings.Contains(keyword, "email") {
			return RandomEmail()
		}
		//如果带Phone,则生成电话
		if strings.Contains(keyword, "phone") || strings.Contains(keyword, "mobile") {
			return RandomPhone()
		}
		//如果带Address,则生成地址
		if strings.Contains(keyword, "address") {
			return RandomAddress()
		}
		//如果带City,则生成城市
		if strings.Contains(keyword, "city") {
			return RandomCity()
		}
		//如果带Country,则生成国家
		if strings.Contains(keyword, "country") {
			return RandomCountry()
		}
		//如果带Url,则生成网址
		if strings.Contains(keyword, "url") {
			return RandomUrl()
		}

		//如果带Description,则生成描述
		if strings.Contains(keyword, "desc") || strings.Contains(keyword, "remark") {
			return RandomLoremSentence()
		}
		//带时间 date time datetime
		if strings.Contains(keyword, "date") || strings.Contains(keyword, "time") {
			return RandomDateTime()
		}
		//如果带Id,则生成Id
		if strings.Contains(keyword, "id") {
			return RandomNumber(10000, 9999999999)
		}
		//如果带uuid,则生成uuid
		if strings.Contains(keyword, "uuid") {
			return UUID()
		}
		//如果带sex,则生成性别
		if strings.Contains(keyword, "sex") {
			return RandomSex()
		}
		//如果带ip,则生成ip
		if strings.Contains(keyword, "ip") {
			return RandomIp()
		}

		return RandomWord()
	case "int", "integer", "int32", "int64", "uint", "uint32", "uint64", "long":
		//timestamp
		if strings.Contains(keyword, "timestamp") {
			return RandomNumber(1493604986, 9999999999)
		}
		//sex 0,1
		if strings.Contains(keyword, "sex") {
			return RandomNumber(0, 1)
		}
		//如果带Age,则生成年龄
		if strings.Contains(keyword, "age") {
			return RandomAge()
		}
		//如果后缀不是64,则生成32位
		if strings.HasSuffix(dataType, "64") || strings.HasSuffix(dataType, "long") {
			return SnowflakeId()
		}
		return RandomNumber(10000, 999999999)
	case "float", "float32", "float64", "double", "decimal", "number", "bigdecimal":
		return RandomFloat(10000, 999999999)
	case "bool":
		number := RandomNumber(0, 100)
		return strconv.FormatBool(number%2 == 0)
	default:
		return RandomLoremSentence()
	}
}

// 随机生成国家
func RandomCountry() string {
	index := RandomNumber(0, int64(len(countries)-1))
	return countries[index]
}

// 随机生成省
func RandomProvince() string {
	index := RandomNumber(0, int64(len(provinces)-1))
	return provinces[index]
}

// 随机生成市
func RandomCity() string {
	index := RandomNumber(0, int64(len(cities)-1))
	return cities[index]
}

// 随机生成区
func RandomArea() string {
	index := RandomNumber(0, int64(len(areas)-1))
	return areas[index]
}

// 随机生成地址
func RandomAddress() string {
	number := RandomNumber(1, 9999)
	var str string
	str = strconv.FormatInt(number, 10)
	return RandomCountry() + " " + RandomProvince() + " " + RandomCity() + " " + RandomArea() + " " + str + "号"

}

// 随机生成电话
func RandomPhone() string {
	//手机号码段
	phonePrefix := []string{
		"134", "135", "136", "137", "138", "139", "150", "151", "152", "157", "158", "159", "182", "183", "187", "188",
		"130", "131", "132", "155", "156", "185", "186", "145", "176", "175", "176", "166",
	}
	index := RandomNumber(0, int64(len(phonePrefix)-1))
	return phonePrefix[index] + strconv.FormatInt(RandomNumber(10000000, 99999999), 10)
}

// 随机生成邮箱
func RandomEmail() string {
	//6~10位英文字符@2~3位英文字符.3位英文字符
	return RandomEnglishChars(RandomNumber(6, 10)) + "@" + RandomEnglishChars(RandomNumber(2, 3)) + "." + RandomEnglishChars(3)

}

// 随机获取n位英文字符
func RandomEnglishChars(n int64) string {
	var str string
	var i int64
	for i = 0; i < n; i++ {
		index := RandomNumber(0, int64(len(englishChars)-1))
		str += englishChars[index]
	}
	return str

}

// 随机生成姓
func RandomLastName() string {
	index := RandomNumber(0, int64(len(lastNames)-1))
	return lastNames[index]
}

// 随机生成 姓氏
func RandomFirstName() string {
	index := RandomNumber(0, int64(len(firsNames)-1))
	return firsNames[index]
}

// 随机生成名字
func RandomName() string {
	return RandomFirstName() + RandomLastName()
}

// 随机性别
func RandomSex() string {
	number := RandomNumber(0, 1)
	if number == 0 {
		return "男"
	}
	return "女"
}

// 随机生产时间
func RandomDateTime() string {
	//随机生产10位时间戳
	timestamp := RandomNumber(1493604986, 9999999999)
	return Format(int64(timestamp), YYYY_MM_DD_HH_MM_SS)
}

// ip地址随机生产
func RandomIp() string {
	number1 := RandomNumber(100, 255)
	number2 := RandomNumber(100, 255)
	number3 := RandomNumber(100, 255)
	number4 := RandomNumber(100, 255)
	return strconv.FormatInt(number1, 10) + "." + strconv.FormatInt(number2, 10) + "." + strconv.FormatInt(number3, 10) + "." + strconv.FormatInt(number4, 10)

}

// 随机生成网址
func RandomUrl() string {
	var url = "https://www." + RandomWord() + ".com?" + RandomWord() + "=" + RandomWord()
	return url
}

// 随机word
func RandomWord() string {
	//随机生成3~10位英文字符
	return RandomEnglishChars(RandomNumber(3, 5))
}

// 随机LoremSentence
func RandomLoremSentence() string {
	//每隔5个单词加一个符号,最大50个单词,最小10个单词
	chars := RandomEnglishChars(RandomNumber(50, 100))
	//随机加句号
	var charsRune = []rune(chars)
	var str string
	str = string(charsRune[0:5]) + ","
	for i := 5; i < len(charsRune); i++ {
		//取v的ascii码, 然后随机于下一个字符ascii码比较,如果大于,则加逗号,跳过5个字符，如果前一个字符除于后一个字符小1,则加句号
		if i+1 < len(charsRune) {
			//如果遇到,和. 和空格,则跳过
			if string(charsRune[i]) == "," || string(charsRune[i]) == "." || string(charsRune[i]) == " " {
				continue
			}
			if RandomNumber(0, int64(charsRune[i])) > RandomNumber(0, int64(charsRune[i+1])) {
				number := int(RandomNumber(5, 10))
				//添加后5个字符
				for j := 0; j < number; j++ {
					if i+j < len(charsRune) {
						str += string(charsRune[i+j])
					}
				}
				str += string(charsRune[i]) + "，"
				i += number
				continue
			}
			if RandomNumber(0, int64(charsRune[i])) < RandomNumber(0, int64(charsRune[i+1])) {

				number := int(RandomNumber(10, 20))
				//添加后5个字符
				for j := 0; j < number; j++ {
					if i+j < len(charsRune) {
						str += string(charsRune[i+j])
					}
				}
				str += string(charsRune[i]) + "。"
				i += number
				continue
			}
			str += string(charsRune[i])
		} else {
			str += string(charsRune[i])
		}

	}
	return str + "。"

}

// 随机生成年龄
func RandomAge() int {
	number := RandomNumber(1, 100)
	return int(number)
}

// 随机生成指定范围的数字
func RandomNumber(min, max int64) int64 {
	return rund_.Int63n(max-min) + min
}

// 随机小数
func RandomFloat(min, max float64) float64 {
	return rund_.Float64()*(max-min) + min
}
